package com.c2b.algorithm.leetcode.base;

import java.util.ArrayList;
import java.util.List;

/**
 * <a href="https://leetcode.cn/problems/rearrange-spaces-between-words/">重新排列单词间的空格</a>
 * <p>
 * 给你一个字符串 text ，该字符串由若干被空格包围的单词组成。每个单词由一个或者多个小写英文字母组成，并且两个单词之间至少存在一个空格。题目测试用例保证 text 至少包含一个单词 。<br>
 * 请你重新排列空格，使每对相邻单词之间的空格数目都 相等 ，并尽可能 最大化 该数目。如果不能重新平均分配所有空格，请 将多余的空格放置在字符串末尾 ，这也意味着返回的字符串应当与原 text 字符串的长度相等。<br>
 * 返回 重新排列空格后的字符串 。<br>
 * </p>
 * <pre>
 * 示例 1：
 *      输入：text = "  this   is  a sentence "
 *      输出："this   is   a   sentence"
 *      解释：总共有 9 个空格和 4 个单词。可以将 9 个空格平均分配到相邻单词之间，相邻单词间空格数为：9 / (4-1) = 3 个。
 *
 * 示例 2：
 *      输入：text = " practice   makes   perfect"
 *      输出："practice   makes   perfect "
 *      解释：总共有 7 个空格和 3 个单词。7 / (3-1) = 3 个空格加上 1 个多余的空格。多余的空格需要放在字符串的末尾。
 *
 * 示例 3：
 *      输入：text = "hello   world"
 *      输出："hello   world"
 *
 * 示例 4：
 *      输入：text = "  walks  udp package   into  bar a"
 *      输出："walks  udp  package  into  bar  a "
 *
 * 示例 5：
 *      输入：text = "a"
 *      输出："a"
 * </pre>
 * <b>提示：</b>
 * <ui>
 * <li>1 <= text.length <= 100</li>
 * <li>text 由小写英文字母和 ' ' 组成</li>
 * <li>text 中至少包含一个单词</li>
 * </ui>
 *
 * @author c2b
 * @since 2023/4/13 10:53
 */
public class LC1592ReorderSpaces_S {

    public String reorderSpaces(String text) {
        // 空格的数量
        int spaceCount = 0;
        // 单词组成的集合
        List<String> wordList = new ArrayList<>();
        // 当前位置
        int currentIndex = 0;
        while (currentIndex < text.length()) {
            // 统计空格的数量
            if (text.charAt(currentIndex) == ' ') {
                ++spaceCount;
                ++currentIndex;
            } else {
                // 统计单词
                final StringBuilder builder = new StringBuilder();
                while (currentIndex < text.length() && text.charAt(currentIndex) != ' ') {
                    builder.append(text.charAt(currentIndex));
                    ++currentIndex;
                }
                wordList.add(builder.toString());
            }
        }
        StringBuilder res = new StringBuilder();
        if (wordList.size() == 1) {
            // 只有一个单词的情况，将空格接到单词后面
            res.append(wordList.get(0));
            for (int i = 0; i < spaceCount; i++) {
                res.append(' ');
            }
            return res.toString();
        } else {
            // 有多个单词的情况，将空格均分到字符串中间，多余的接到后面
            int blankCount = spaceCount / (wordList.size() - 1);
            int suffixCount = spaceCount % (wordList.size() - 1);
            res = new StringBuilder();
            for (int i = 0; i < wordList.size(); i++) {
                res.append(wordList.get(i));
                if (i != wordList.size() - 1) {
                    for (int j = 0; j < blankCount; j++) {
                        res.append(' ');
                    }
                } else {
                    for (int j = 0; j < suffixCount; j++) {
                        res.append(' ');
                    }
                }
            }
        }
        return res.toString();
    }

    public static void main(String[] args) {
        LC1592ReorderSpaces_S lc1592ReorderSpaces_s = new LC1592ReorderSpaces_S();
        System.out.println(lc1592ReorderSpaces_s.reorderSpaces("  hello"));
    }
}
